/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.hortonworks.amuise.cdrstorm.storm.topologies;
import backtype.storm.Config;
import backtype.storm.StormSubmitter;
import backtype.storm.spout.SchemeAsMultiScheme;
import backtype.storm.topology.TopologyBuilder;
import com.hortonworks.amuise.cdrstorm.storm.bolts.LoggingBolt;
import com.hortonworks.amuise.cdrstorm.storm.spouts.CDRScheme;
import com.hortonworks.amuise.cdrstorm.storm.spouts.TwitterScheme;
import com.hortonworks.amuise.cdrstorm.storm.utils.CDRStormContext;
import java.util.Properties;
import org.apache.log4j.Logger;
import storm.kafka.BrokerHosts;
import storm.kafka.KafkaSpout;
import storm.kafka.SpoutConfig;
import storm.kafka.ZkHosts;
/**
*
* @author adammuise
*/
public class CDRStormTopology {
Properties globalconfigs;
private static final Logger logger = Logger.getLogger(CDRStormTopology.class);
public CDRStormTopology() {
CDRStormContext cdrstormcontext = new CDRStormContext();
this.globalconfigs = cdrstormcontext.config;
}
public void setupLoggingBolts(TopologyBuilder bldr) {
LoggingBolt cdrLoggingBolt = new LoggingBolt();
bldr.setBolt("cdrLoggingBolt", cdrLoggingBolt, 4).shuffleGrouping("cdrKafkaSpout");
LoggingBolt twitterLoggingBolt = new LoggingBolt();
bldr.setBolt("twitterLoggingBolt", twitterLoggingBolt, 4).shuffleGrouping("twitterKafkaSpout");
}
public void setupTwitterSpout(TopologyBuilder bldr) {
KafkaSpout kafkaSpout = constructTwitterKafkaSpout();
int spoutCount = Integer.valueOf(globalconfigs.getProperty("cdrstorm.kafkaspout.spout.thread.count"));
bldr.setSpout("twitterKafkaSpout", kafkaSpout, spoutCount);
}
public void setupCDRSpout(TopologyBuilder bldr) {
KafkaSpout kafkaSpout = constructCDRKafkaSpout();
int spoutCount = Integer.valueOf(globalconfigs.getProperty("cdrstorm.kafkaspout.spout.thread.count"));
bldr.setSpout("cdrKafkaSpout", kafkaSpout, spoutCount);
}
private KafkaSpout constructCDRKafkaSpout() {
BrokerHosts zkhosts = new ZkHosts(globalconfigs.getProperty("cdrstorm.kafkaspout.zkhosts"));
String topic = globalconfigs.getProperty("cdr.kafkatopic");
String zkRoot = globalconfigs.getProperty("cdrstorm.kafkaspout.zkroot");
String consumerGroupId = globalconfigs.getProperty("cdrstorm.kafkaspout.cdr.consumergroupid");
SpoutConfig spoutConfig = new SpoutConfig(zkhosts, topic, zkRoot, consumerGroupId);
spoutConfig.scheme = new SchemeAsMultiScheme(new CDRScheme());
KafkaSpout kafkaspout = new KafkaSpout(spoutConfig);
return kafkaspout;
}
private KafkaSpout constructTwitterKafkaSpout() {
BrokerHosts zkhosts = new ZkHosts(globalconfigs.getProperty("cdrstorm.kafkaspout.zkhosts"));
String topic = globalconfigs.getProperty("twitter4j.kafkatopic");
String zkRoot = globalconfigs.getProperty("cdrstorm.kafkaspout.zkroot");
String consumerGroupId = globalconfigs.getProperty("cdrstorm.kafkaspout.cdr.consumergroupid");
SpoutConfig spoutConfig = new SpoutConfig(zkhosts, topic, zkRoot, consumerGroupId);
//Create scheme for Twitter
spoutConfig.scheme = new SchemeAsMultiScheme(new TwitterScheme());
KafkaSpout kafkaspout = new KafkaSpout(spoutConfig);
return kafkaspout;
}
private void buildAndSubmitTopology() throws Exception {
TopologyBuilder builder = new TopologyBuilder();
setupCDRSpout(builder);
setupTwitterSpout(builder);
setupLoggingBolts(builder);
//submit
/* This conf is for Storm and it needs be configured with things like the following:
* Zookeeper server, nimbus server, ports, etc... All of this configuration will be picked up
* in the ~/.storm/storm.yaml file that will be located on each storm node.
*/
Config conf = new Config();
conf.setDebug(true);
/* Set the number of workers that will be spun up for this topology.
* Each worker represents a JVM where executor thread will be spawned from */
Integer topologyWorkers = Integer.valueOf(globalconfigs.getProperty("cdrstorm.topologyworkers"));
conf.put(Config.TOPOLOGY_WORKERS, topologyWorkers);
try {
StormSubmitter.submitTopology("cdrstorm", conf, builder.createTopology());
} catch (Exception e) {
logger.error("Error submiting Topology", e);
}
}
public static void main(String[] args) {
CDRStormTopology cdrstorm = new CDRStormTopology();
try {
cdrstorm.buildAndSubmitTopology();
} catch (Exception e) {
System.out.println("Error starting topology: " + e.getMessage());
e.printStackTrace();
}
}
}